/**
 * <h3>opusController</h3>
 * <p> 作品信息管理控制器类 </p>
 *
 * <h3>功能描述</h3>
 * <p> 提供作品信息的增删改查等基础操作接口，统一返回AjaxResult格式结果 </p>
 * <p> 所有接口均基于RESTful风格设计，配合SpringMVC与Swagger注解实现标准化API输出 </p>
 *
 * <h3>元数据</h3>
 * <ul>
 *    <li> 作者：郭强 </li>
 *    <li> 创建日期：2025年05月06日 21:09:09 </li>
 * </ul>
 *
 * <h3>其他信息</h3>
 * <ul>
 *    <li> 参考链接：<a href="https://fantastic-admin.hurui.me/guide/permission.html">权限控制文档</a></li>
 *    <li> 示例代码：{@code new opusController()} </li>
 * </ul>
 *
 * @apiNote 接口需结合前端权限配置使用，确保安全性；当前未启用权限注解
 * @implSpec 继承自 {@link BaseController}，复用分页、返回封装等通用逻辑
 * @since v1.0.0.0
 */

package com.dnndo.web.controller.system;

import com.dnndo.common.annotation.Log;
import com.dnndo.common.core.controller.BaseController;
import com.dnndo.common.core.domain.AjaxResult;
import com.dnndo.common.core.domain.PageResult;
import com.dnndo.common.enums.BusinessType;
import com.dnndo.common.utils.bean.BeanDtoVoUtil;
import com.dnndo.system.domain.Opus;
import com.dnndo.system.domain.dto.OpusDTO;
import com.dnndo.system.domain.vo.OpusVO;
import com.dnndo.system.service.IOpusService;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;

/**
 * 作品信息controller类
 *
 * @author 郭强
 */
@RestController
@RequestMapping("/system/opus")
public class OpusController extends BaseController {

    private final IOpusService opusService;

    @Autowired
    public OpusController(IOpusService opusService) {
        this.opusService = opusService;
    }

    /**
     * 查询作品列表（分页）
     *
     * @param dto 作品查询条件封装对象，包含名称、用户ID等过滤条件
     * @return PageResult<OpusVO> 分页后的作品信息列表及总记录数
     * @see com.dnndo.system.domain.dto.OpusDTO
     */
    @PreAuthorize("@ss.hasPermi('opus:list')")
    @GetMapping("/list")
    public PageResult<OpusVO> list(OpusDTO dto) {
        startPage();
        List<Opus> list = opusService.selectOpusList(dto);
        return PageResult.pageOk(BeanDtoVoUtil.listVo(list, OpusVO.class), new PageInfo<>(list).getTotal());
    }

    /**
     * 查询设计师列表（分页）
     *
     * @param dto 作品查询条件封装对象，包含名称、用户ID等过滤条件
     * @return result 分页后的作品信息列表及总记录数
     * @see com.dnndo.system.domain.dto.OpusDTO
     */
    @PreAuthorize("@ss.hasPermi('opus:list')")
    @GetMapping("/designerlist")
    public AjaxResult designerlist(OpusDTO dto) {
        startPage();
        List<HashMap<String, Object>> list = opusService.selectdesignerlist(dto);
        // 创建返回的HashMap
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("msg", "操作成功");
        result.put("rows", list);
        result.put("total", new PageInfo<>(list).getTotal());

        return AjaxResult.success(result);
    }

    /**
     * 根据作品ID获取详细信息
     *
     * @param opusId 作品唯一标识符
     * @return AjaxResult 包含作品详细信息的响应结果
     * @see com.dnndo.system.domain.dto.OpusDTO
     */
    @GetMapping("/getInfo")
    public AjaxResult getInfo(@ApiParam(value = "作品ID", required = true) Long opusId) {
        OpusDTO opus = opusService.selectOpusListById(opusId);
        return AjaxResult.success(BeanDtoVoUtil.convert(opus, OpusVO.class));
    }

    /**
     * 根据用户ID获取详细信息
     *
     * @param userId 作品唯一标识符
     * @return result 包含作品详细信息的响应结果
     * @see com.dnndo.system.domain.dto.OpusDTO
     */
    @GetMapping("/getdesignerInfo")
    public AjaxResult getdesignerInfo(@ApiParam(value = "用户ID", required = true) Long userId) {
        HashMap<String,Object> designer = opusService.selectdesignerListById(userId);
        // 创建返回的HashMap
        HashMap<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("msg", "操作成功");
        result.put("rows", designer);
        return AjaxResult.success(result);
    }

    /**
     * 新增作品信息
     *
     * @param dto 前端传入的作品数据传输对象，包含新增字段
     * @return AjaxResult 操作结果返回对象，包含成功或失败状态
     * @see com.dnndo.system.domain.dto.OpusDTO
     */
    @Log(title = "作品管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody OpusDTO dto) {
        dto.setUserId(getUserId().intValue());
        return toAjax(opusService.insertOpus(dto));
    }

    /**
     * 修改已有作品信息
     *
     * @param dto 前端传入的作品数据传输对象，包含更新字段
     * @return AjaxResult 操作结果返回对象，包含成功或失败状态
     * @see com.dnndo.system.domain.dto.OpusDTO
     */
    @Log(title = "作品管理", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    public AjaxResult edit(@Validated @RequestBody OpusDTO dto) {
        OpusDTO opusDTO = BeanDtoVoUtil.convert(dto, OpusDTO.class);
        return toAjax(opusService.updateOpusById(opusDTO));
    }

    /**
     * 删除指定ID的作品信息
     *
     * @param opusId 要删除的作品唯一标识符
     * @return AjaxResult 操作结果返回对象，包含成功或失败状态
     * @see com.dnndo.system.domain.dto.OpusDTO
     */
    @Log(title = "作品管理", businessType = BusinessType.DELETE)
    @GetMapping("/del")
    public AjaxResult del(@ApiParam(value = "作品ID", required = true) Integer opusId) {
        return toAjax(opusService.deleteOpusById(opusId));
    }
}
